package stack

import (
	"hi-jvm/instructions/base"
	"hi-jvm/rtda"
)

/*
栈指令直接对操作数栈进行操作，共9条
pop/pop2： 将栈顶变量弹出
dup系列指令： 复制栈顶变量
swap指令： 交换栈顶的两个变量

和其他指令不同，栈指令不关心变量类型。
 */

// 指令码： 0x57
type POP struct{ base.NoOperandsInstruction }

// 指令码： 0x58
// Pop the top one and two operand stack values
type POP2 struct{ base.NoOperandsInstruction }

/*
bottom -> top
[...][c][b][a]
            |
            V
[...][c][b]
*/
func (self *POP) Execute(frame *rtda.Frame) {
	stack := frame.OperandStack
	stack.PopSlot()
}

/*
bottom -> top
[...][c][b][a]
         |  |
         V  V
[...][c]
*/
func (self *POP2) Execute(frame *rtda.Frame) {
	stack := frame.OperandStack
	stack.PopSlot()
	stack.PopSlot()
}